#include <stdlib.h>
#include <signal.h>
#include <time.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/socket.h>
#include <sys/time.h>
#include "monitor.h"

Monitor monitor;

void sigalrm(int signum)
{
	printf("-------------print-----------------------\n");
	for(int i=0; i<monitor.varcap; i++)
	{
		if(monitor.arr[i].usable)
		{
			printf("%lu %s %s %u\n",time(NULL),
				monitor.arr[i].pname,
				monitor.arr[i].varname,
				monitor.arr[i].value);
		}
	}
}

void init_monitor(size_t varcap,size_t timer)
{
	// 创建消息队列
	monitor.msgfd = msgget(MSG_KEY,IPC_CREAT|0644);
	if(0 > monitor.msgfd)
	{
		perror("msgget");
		exit(-1);
	}
	
	// 创建共享内存
	monitor.shmfd = shmget(SHM_KEY,sizeof(Variable)*varcap,IPC_CREAT|0644);
	if(0 > monitor.shmfd)
	{
		perror("shmget");
		exit(-1);
	}
	
	// 映射共享内存
	monitor.arr = shmat(monitor.shmfd,NULL,0);
	if((void *)-1 == monitor.arr)
	{
		perror("shmat");
		exit(-1);
	}
	
	// 初始化所有变量的使用标志位
	for(int i=0; i<varcap; i++)
	{
		monitor.arr[i].usable = false;
	}
	
	// 备份变量数量
	monitor.varcap = varcap;
	
	// 创建socket对象
	monitor.sockfd = socket(AF_INET,SOCK_DGRAM,0);
	if(0 > monitor.sockfd)
	{
		perror("socket");
		exit(-1);
	}
	
	// 绑定时钟处理信号
	signal(SIGALRM,sigalrm);
	
	// 设置定时器
	struct itimerval it = {{timer,0},{timer,0}};
	setitimer(ITIMER_REAL,&it,NULL);
}

static int query_null(void)
{
	if(0 == monitor.varcap)
		return -1;
	
	for(int i=0; i<monitor.varcap; i++)
	{
		if(!monitor.arr[i].usable)
			return i;
	}
	
	return -1;
}

void wait_monitored(void)
{
	Msg msg;

	for(;;)
	{
		if(0 > msgrcv(monitor.msgfd,&msg,sizeof(msg)-sizeof(msg.type),0,0))
		{
			continue;
		}
		
		if(Register == msg.type)
		{
			printf("----------------------\n");
			msg.type = RegisterResult;
			msg.id = query_null();
			monitor.arr[msg.id].usable = true;
			monitor.varcap--;
			msgsnd(monitor.msgfd,&msg,sizeof(msg)-sizeof(msg.type),0);
		}
		else if(Cancel == msg.type)
		{
			monitor.varcap++;
		}
	}
}

void wait_viewers(void)
{

}

void exit_monitor(void)
{

}


